package ch.rasc.s4ws.brainshop;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.PostConstruct;
import org.springframework.util.StringUtils;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class BrainService {
public final static ObjectMapper objectMapper = new ObjectMapper();
@SuppressWarnings("unused")
@PostConstruct
public void init() {
new Board("Brainstorm");
}
public void removeSession(String id) {
Board.removeUserFromAllBoards(id);
}
public void handleIncomingMessage(WebSocketSession session, BrainMessage bm) {
if (bm.getType().equals("idea")) {
handleIncomingIdea(bm);
}
else if (bm.getType().equals("command")) {
if (bm.getCommand().equals("init")) {
handleInit(session, bm);
}
else if (bm.getCommand().equals("delete")) {
handleDelete(bm);
}
else if (bm.getCommand().equals("like")) {
handleLike(bm);
}
else if (bm.getCommand().equals("dislike")) {
handleDislike(bm);
}
else if (bm.getCommand().equals("delete-board")) {
handleDeleteBoard(bm);
}
}
}
private static void handleInit(WebSocketSession session, BrainMessage bm) {
if (StringUtils.hasText(bm.getBoard())) {
Board board = Board.get(bm.getBoard());
if (board == null) {
board = new Board(bm.getBoard());
Board.broadcastAllBoards();
}
board.addUser(session);
Map<String, Object> msg = new HashMap<>();
Map<String, Object> data1 = new HashMap<>();
data1.put("type", "board-list");
data1.put("boards", Board.all());
Map<String, Object> data2 = new HashMap<>();
data2.put("type", "ideas");
data2.put("ideas", board.getAllIdeas());
msg.put("type", "init");
msg.put("data", new Object[] { data1, data2 });
try {
TextMessage tm = new TextMessage(
BrainService.objectMapper.writeValueAsString(msg));
if (session.isOpen()) {
session.sendMessage(tm);
}
else {
board.removeUser(session);
}
}
catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
catch (IOException e) {
e.printStackTrace();
board.removeUser(session);
}
}
}
private static void handleDelete(BrainMessage bm) {
Board board = Board.get(bm.getBoard());
Map<String, Object> msg = new HashMap<>();
msg.put("type", "command");
msg.put("command", "delete");
msg.put("board", bm.getBoard());
msg.put("id", bm.getId());
board.sendToAllUsers(msg);
board.removeIdea(bm.getId());
}
private static void handleLike(BrainMessage bm) {
Board board = Board.get(bm.getBoard());
Idea idea = board.getIdea(bm.getId());
idea.like(bm.getUser());
idea.setLast(true);
board.sendToAllUsers(idea);
}
private static void handleDislike(BrainMessage bm) {
Board board = Board.get(bm.getBoard());
Idea idea = board.getIdea(bm.getId());
idea.dislike(bm.getUser());
idea.setLast(true);
board.sendToAllUsers(idea);
}
private static void handleDeleteBoard(BrainMessage bm) {
Board.remove(bm.getName());
Board.broadcastAllBoards();
}
private static void handleIncomingIdea(BrainMessage bm) {
Board board = Board.get(bm.getBoard());
boolean isNew = false;
Idea idea;
if (bm.getId() != null) {
idea = board.getIdea(bm.getId());
}
else {
isNew = true;
idea = Idea.createIdea();
}
idea.setDate(LocalDateTime.now()
.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")));
idea.setGroup(bm.getGroup());
idea.setText(bm.getText());
idea.setNext(bm.getNext());
if (isNew) {
board.addIdea(idea);
}
else {
board.moveIdea(idea);
}
board.sendToAllUsers(idea);
}
}